package com.ssm.circle.server.config.web;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

import com.ssm.circle.server.config.interceptor.LoginInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

import java.util.List;

/**
 * MVC的全局处理(空值)
 */
@Configuration
public class GlobalConfig extends WebMvcConfigurationSupport {
    /**
     * configureMessageConverters：配置在 MVC 中用于处理 HTTP 消息转换的转换器列表。
     * @param converters
     */
    @Override
    protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        super.configureMessageConverters(converters); //保留父类对消息转换器列表已经做过的配置
        converters.add(mappingJackson2HttpMessageConverter()); //添加自定义的转换器
    }

    @Override
    protected void addInterceptors(InterceptorRegistry registry) {
        //父类方法中未做任何配置，子类不需要super,可直接重写
        registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**"); //拦截所有
    }

    /**
     * 自定义mappingJackson2HttpMessageConverter
     * 目前实现：空值忽略，空字段可返回
     */
    private MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
        //ObjectMapper是 Jackson 库中用于处理 JSON 序列化和反序列化的核心类。
        ObjectMapper objectMapper = new ObjectMapper();
        // Jackson 库中的一个序列化特性: 默认情况下，序列化一个空对象时，会抛出异常。通过将这个特性设置为false，就改变了这种行为。
        objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
        //设置序列化包含规则：在序列化时只包含非空的属性值(忽略空值)
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        return new MappingJackson2HttpMessageConverter(objectMapper);
    }

}
